<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../lib/index.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        canvas {
            margin: 50px auto 0;
            display: block;
            background: yellow;
        }
    </style>
</head>
<body>
<canvas id="canvas" width="400" height="400">
    此浏览器不支持canvas
</canvas>
</body>
</html>

<script>
    const ctx = document.getElementById('canvas')
    const gl = ctx.getContext('webgl')

    // step1: 创建着色器源码
    // 顶点着色器
    const VERTEX_SHADER_SOURCE = `
        attribute vec4 aPosition; // 声明变量的语法结构
        void main() {
            gl_Position = aPosition;
            gl_PointSize = 30.0;
        }
`
    // 片元着色器
    const FRAGMENT_SHADER_SOURCE = `
        void main() {
            gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 这里的分号不能丢
        }
    `
    // step2: 公用方法
    const program = initShader(gl, VERTEX_SHADER_SOURCE, FRAGMENT_SHADER_SOURCE)

    // step3: 获取attribute变量
    const aPosition = gl.getAttribLocation(program, 'aPosition');

    // 鼠标点击效果
    ctx.onmousemove = function (ev) {
        // 坐标
        const x = ev.clientX;
        const y = ev.clientY;

        // 获取画布的位置
        const domPosition = ev.target.getBoundingClientRect();

        // dom节点的坐标
        const domX = x - domPosition.left;
        const domY = y - domPosition.top;

        /**
         * 转换为三维坐标系的坐标
         * 水平方向：（需要先 - 当前画布的宽度），然后再除以 当前画布的宽度
         * 如：0， 200， 400
         *  -1 ， 0， 1
         *  -200, 0, 200
         *  垂直方向：
         * 如：1， 0， -1， 对应 0， 200， 400
         *  更改为 200， 0， 200 / 200
         *  需要先让 200减这个数，然后再除以200
         */
        const halfWidth = ctx.offsetWidth / 2;
        const halfHeight = ctx.offsetHeight / 2;
        const clickX = (domX - halfWidth) / halfWidth;
        const clickY =  (halfHeight - domY) / halfHeight;
        console.log(clickX, clickY);

        // step4: 给 attribute 变量赋值
        gl.vertexAttrib2f(aPosition, clickX, clickY);

        // step5: 执行绘制
        gl.drawArrays(gl.POINTS, 0, 1) // 绘制点
    }

</script>
